#include "int_key.h"
#include "led.h"
#include "beep.h"
#include "systick.h"
// 中断处理初始化
void key_int_init(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);

	GPIO_InitTypeDef k;
	k.GPIO_Mode = GPIO_Mode_IN;
	k.GPIO_Pin = GPIO_Pin_0;
	//	k.GPIO_PuPd = GPIO_PuPd_NOPULL;
	k.GPIO_PuPd = GPIO_PuPd_UP;
	k.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init(GPIOA, &k);

	k.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
	GPIO_Init(GPIOE, &k);

	// 时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	// 按键引脚的映射 gpioX -- extiX
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
	// 外部中断处理 时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_EXTIT, ENABLE);
	// EXTI 外部中断的缩写 External interrupt
	EXTI_InitTypeDef e;
	e.EXTI_Line = EXTI_Line0 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4;
	e.EXTI_LineCmd = ENABLE;
	e.EXTI_Mode = EXTI_Mode_Interrupt;
	//	e.EXTI_Trigger = EXTI_Trigger_Rising_Falling;	// 双边触发方式，就是按键在按下和松开都会有处理
	e.EXTI_Trigger = EXTI_Trigger_Falling; // 只在上边缘的时候会进行操作

	EXTI_Init(&e);

	// NVIC的对中断源的控制，不需要时钟使能

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 抢占优先级的准备位数为两位

	NVIC_InitTypeDef ic;

	ic.NVIC_IRQChannel = EXTI0_IRQn;
	ic.NVIC_IRQChannelCmd = ENABLE;
	ic.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级为2，数字越低，优先级越高
	ic.NVIC_IRQChannelSubPriority = 2;		  //子优先级为2

	NVIC_Init(&ic);

	ic.NVIC_IRQChannel = EXTI2_IRQn;
	ic.NVIC_IRQChannelPreemptionPriority = 2; // 降低优先级，无法抢占高优先级的中断操作
	ic.NVIC_IRQChannelSubPriority = 1;		  // 当主优先级相同且同时到，子优先级的高低进行影响
	NVIC_Init(&ic);

	ic.NVIC_IRQChannel = EXTI3_IRQn;
	ic.NVIC_IRQChannelPreemptionPriority = 2; // 同优先级也无法抢占
	NVIC_Init(&ic);

	ic.NVIC_IRQChannel = EXTI4_IRQn;
	NVIC_Init(&ic);

	////获取中断信号,判断是不是产生中断,EXTI_GetITStatus这个也行
	//	if(EXTI_GetFlagStatus(EXTI_Line0)==SET)
	//	{
	////		EXTI0_IRQHandler();	不需要自己调用，因为已经对应起来了，直接使用就行了
	////释放中断
	//	EXTI_ClearFlag(EXTI_Line0);
	//	}
}

int flag0 = 0, flag2 = 0, flag3 = 0, flag4 = 0;
int delayTime = 0x6644444;

// // 配合main.c的一个状态量
uint8_t status = 0;

void EXTI0_IRQHandler()
{
	//	led_loop();
	//	按下熄灭，抬起亮灯

	//	if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)){
	//			led_ctrl_gpio(5);
	//			return;
	//		}

	//	按下亮灯，抬起熄灭
	//	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)){
	//				led_ctrl_gpio(5);
	//				return;
	//	}

	if (EXTI_GetFlagStatus(EXTI_Line0) == SET)
	{

		// GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
		// uint32_t mstime = 200;
		// Delay_ms(mstime); // 等待2000ms
		status = 1;
		// delay(0x5000); // 加一个delay，防止出现顺序的混乱
		EXTI_ClearFlag(EXTI_Line0);
	}
}
void EXTI2_IRQHandler()
{
	//获取中断信号,判断是不是产生中断,EXTI_GetITStatus这个也行
	if (EXTI_GetFlagStatus(EXTI_Line2) == SET)
	{
		if (flag2 == 0)
		{
			GPIO_ResetBits(GPIOF, GPIO_Pin_10);
			flag2 = 1;
		}
		else if (flag2 == 1)
		{
			GPIO_SetBits(GPIOF, GPIO_Pin_10);
			flag2 = 0;
		}
		// delay(0x50000);
		//释放中断
		EXTI_ClearFlag(EXTI_Line2);
	}
}
void EXTI3_IRQHandler()
{

	if (EXTI_GetFlagStatus(EXTI_Line3) == SET)
	{
		if (flag3 == 0)
		{
			beep_on();
			//			delay(delayTime);
			flag3 = 1;
		}
		else if (flag3 == 1)
		{
			beep_off();
			flag3 = 0;
		}
		delay(0x50000);
		//释放中断
		EXTI_ClearFlag(EXTI_Line3);
	}
}
void EXTI4_IRQHandler()
{
	if (EXTI_GetFlagStatus(EXTI_Line4) == SET)
	{

		GPIO_ToggleBits(GPIOE, GPIO_Pin_13);
		// delay(0x50000);
		//	  	if(flag4 == 0){
		//			GPIO_ResetBits(GPIOE, GPIO_Pin_13);
		//			flag4 = 1;
		//
		//		}else if(flag4 == 1){
		//			GPIO_SetBits(GPIOE, GPIO_Pin_13);
		//			flag4 = 0;
		//		}

		//释放中断
		EXTI_ClearFlag(EXTI_Line4);
	}
}
